// 定义包路径，用于组织Java类的命名空间
package com.itheima.demo;

// 定义一个名为Test3的公开类，用于实现验证码生成功能
public class Test3 {
    // 定义主方法，Java程序的入口点
    public static void main(String[] args) {
        // 目标：开发验证码功能
        // 1、调用getCode方法生成4位验证码并打印输出
        System.out.println(getCode(4));
        // 调用getCode方法生成6位验证码并打印输出
        System.out.println(getCode(6));
    }

    // 定义getCode方法，用于生成指定长度的随机验证码
    // 参数n：验证码的位数
    // 返回值：生成的随机验证码字符串
    public static String getCode(int n) {
        // 2、定义一个字符串变量用于存储生成的验证码
        String code = "";
        // 3、循环n次，每次生成一个字符并添加到验证码中
        for (int i = 0; i < n; i++) {
            // i表示当前循环的索引，从0开始，到n-1结束
            // 4、为当前位置随机生成一个字符类型（数字、大写字母或小写字母）
            // 生成0、1或2中的一个随机整数，分别代表数字(0)、大写字母(1)、小写字母(2)
            int type = (int) (Math.random() * 3);  // Math.random()返回[0,1)的随机小数，乘以3后转为整数得到0、1、2
            // 5、使用switch语句根据随机生成的类型值决定生成哪种字符
            switch (type) {
                // 当type为0时，生成数字
                case 0:
                    // 6、如果当前位置是数字，则随机生成一个0-9的数字
                    // Math.random() * 10 得到[0,10)的随机数，转换为整数后得到0-9
                    int num = (int) (Math.random() * 10);
                    // 将生成的数字添加到验证码字符串中
                    code += num;
                    // 跳出switch语句，防止穿透
                    break;
                // 当type为1时，生成大写字母
                case 1:
                    // 7、如果当前位置是大写字母，则随机生成一个A-Z的大写字母
                    // 生成0-25的随机数，用于表示字母表中的位置（A对应0，B对应1，...，Z对应25）
                    int num1 = (int) (Math.random() * 26); // [0,25]
                    // A的ASCII码是65，所以65+num1得到对应的大写字母的ASCII码，然后转换为字符类型
                    char ch = (char) (65 + num1); // 得到大写字母的随机编号，转成大写字母
                    // 将生成的大写字母添加到验证码字符串中
                    code += ch;
                    // 跳出switch语句
                    break;
                // 当type为2时，生成小写字母
                case 2:
                    // 8、如果当前位置是小写字母，则随机生成一个a-z的小写字母
                    // 生成0-25的随机数，用于表示字母表中的位置（a对应0，b对应1，...，z对应25）
                    int num2 = (int) (Math.random() * 26); // [0,25]
                    // a的ASCII码是97，所以97+num2得到对应的小写字母的ASCII码，然后转换为字符类型
                    char ch1 = (char) (97 + num2);
                    // 将生成的小写字母添加到验证码字符串中
                    code += ch1;
                    // 跳出switch语句
                    break;
            }
        }
        // 返回生成的完整验证码字符串
        return code;
    }
}
